#!/usr/bin/env python3
# -*- coding:utf-8 -*-

from datetime import datetime, timedelta, timezone

# datatime 是 Python 处理日期和时间的标准库

# 获取当前时间
now = datetime.now()
print(now)  # 2018-07-10 20:45:46.393120
print(type(now))  # <class 'datetime.datetime'>

"""
注意: datetime 是模块, datetime 模块还包含一个 datetime 类,通过
from datetime import datetime 导入的才是 datetime 这个类
"""

# 获取指定日期和时间
dt = datetime(2015, 4, 19, 12, 30)
print(dt)  # 2015-04-19 12:30:00

# datetime 转换为 timestamp
"""
在计算机中，时间实际上是用数字表示的。我们把1970年1月1日 00:00:00 UTC+00:00时区的时刻称为epoch time，记为0（1970年以前的时间timestamp为负数），当前时间就是相对于epoch time的秒数，称为timestamp
"""
# 把datetime转换为timestamp,注意Python的timestamp是一个浮点数。如果有小数位，小数位表示毫秒数。
print(dt.timestamp())  # 1429417800.0

# timestamp -> datetime
t = 1429417800.0
print(datetime.fromtimestamp(t))  # 2015-04-19 12:30:00
# 注意到timestamp是一个浮点数，它没有时区的概念，而datetime是有时区的。上述转换是在timestamp和本地时间做转换
# timestamp也可以直接被转换到UTC标准时区的时间：
print(datetime.utcfromtimestamp(t))  # UTC时间

# str 转换为 datetime
cday = datetime.strptime('2016-6-1 18:19:21', '%Y-%m-%d %H:%M:%S')
print(cday)
# 字符串'%Y-%m-%d %H:%M:%S'规定了日期和时间部分的格式。详细的说明请参考Python文档。


# datetime 转换为 str  datetime.strftime()
now = datetime.now()
print(now.strftime('%a, %b %d %H:%M'))  # Tue, Jul 10 20:57

# datetime 加减
# 对日期和时间的加减,实际上就是把 datetime 往后或者往前肌酸,得到新的 datetime, 加减可以直接使用+/-,不过需要导入 timedelta
now = datetime.now()
now = now + timedelta(hours=1)  # 加1小时
print(now)
# 可见，使用timedelta你可以很容易地算出前几天和后几天的时刻。

now = now + timedelta(hours=2, days=1)
print(now)

# 本地时间转换为 utc 时间
# 本地时间是指系统设定市区的时间, utc 时间指 utc+0:00时区的时间

tz_utc_8 = timezone(timedelta(hours=8))  # 创建时区 utc+8
print(tz_utc_8)  # UTC+08:00

"""
小结

datetime表示的时间需要时区信息才能确定一个特定的时间，否则只能视为本地时间。

如果要存储datetime，最佳方法是将其转换为timestamp再存储，因为timestamp的值与时区完全无关

"""
